USE business;
-- jeli w bazie danych istnieje procedura skadowana ...
IF OBJECT_ID('dbo.dynamiczny_filtr') IS NOT NULL
	DROP PROCEDURE dbo.dynamiczny_filtr;  -- ... to j usuwamy
GO
-- tworzymy dynamiczn procedur z dwoma parametrami @p_pensja i @p_dzial
CREATE PROCEDURE dbo.dynamiczny_filtr
	@p_pensja AS MONEY        = NULL,
	@p_dzial  AS NVARCHAR(20) = NULL
AS
BEGIN
	DECLARE @sql NVARCHAR(1000); -- deklaracja zmiennej przechowujcej dynamiczne zapytanie
-- budowa dynamicznego zapytania pobierajcego dane w zalenoci ...
	SET @sql = N'SELECT p.Imie, p.Nazwisko, p.Pensja, d.Nazwa ' +
		N'FROM Pracownicy p, Dzialy d ' +
		N'WHERE p.id_dzialu = d.id_dzialu ' +
		-- ... od tego, czy podano wielko pensji ...
		CASE 
WHEN @p_pensja IS NOT NULL THEN   -- jeli podano wielko pensji
		  N'AND p.Pensja >= @pensja ' -- to dodawany jest odpowiedni warunek
ELSE ''     -- w przypadku, gdy nie podano pensji dadawany jest pusty cig
END +
-- ... oraz, czy podano dzia
		CASE 
WHEN @p_dzial IS NOT NULL THEN   -- jeli podano dzia
		  N'AND UPPER(d.Nazwa) = UPPER(@dzial) ' -- to dodawany jest odpowiedni warunek
ELSE ''    -- w przypadku, gdy nie podano dziau dadawany jest pusty cig 
END;

	-- wykonanie zapytania SQL
	EXEC sp_executesql
		@sql,
		N'@pensja AS MONEY, @dzial AS NVARCHAR(20)',
		@pensja = @p_pensja,
		@dzial  = @p_dzial;  
END;



-- pobranie wszystkich pracownikw z dziau Informatyka zarabiajcych co najmniej 2500 z
EXECUTE [dbo].[dynamiczny_filtr] 2500, 'Informatyka';
-- pobranie wszystkich pracownikw z dziau Informatyka
EXECUTE [dbo].[dynamiczny_filtr] NULL, 'Informatyka';
-- pobranie wszystkich pracownikw zarabiajcych co najmniej 2500 z
EXECUTE [dbo].[dynamiczny_filtr] 2500, NULL;
-- pobranie wszystkich pracownikw
EXECUTE [dbo].[dynamiczny_filtr] NULL, NULL;